﻿#ifndef _ROLEMANAGER_H_INCLUDE_
#define _ROLEMANAGER_H_INCLUDE_

#include <QList>
#include <QHash>
#include <QJsonArray>

class QWebSocket;
class BaseRole;

class RoleManager
{
public:
    RoleManager();
    ~RoleManager();

    /// 从XML中导入怪物配置
    bool loadMonsterFromXML(QString filepath);

    /// 删除所有的怪物
    void deleteAllMonsters(void);
    /// 得到指定数量的空闲怪物
    QList<BaseRole*> getFreeMonsters(int count,int mapIndex);
    /// 将死亡怪物重新加入空闲列表中
    int returnTheMonsters(BaseRole* monsters);
    /// 将所有的角色转换成JSON格式
    QJsonArray TransformationAllRoleToJSON(BaseRole *pBaseRole);

    /// 添加一个玩家到系统中
    void addPlayer(BaseRole *player);
    /// 从系统中清除指定玩家
    void deletePlayer(BaseRole *player);
    /// 根据socket清除指定的玩家
    void deletePlayerByWebsocket(QWebSocket *socket);
    /// 根据socket得到指定玩家
    BaseRole* getRoleByWebsocket(QWebSocket *socket);
    /// 根据ID得到指定的角色
    BaseRole* getRoleById(int id);
    /// 从系统中清除所有玩家
    void deleteAllPlayers(void);
    /// 得到在线玩家列表
    inline QHash<QWebSocket*,BaseRole*>& getAllPlayers(void) { return mOnlinePlayList; }
    /// 从可视角色列表中删除指定角色
    bool delRoleFromViewList(BaseRole *role);
    /// 从相关联的NPC列表中删除指定的角色
    void delRoleFromMonsterList(BaseRole *role);
    /// 得到同地图的其它在线玩家
    QVector<BaseRole*> getSameMapOtherRoles(BaseRole *role);
    /// 得到指定玩家同地图的所有在线玩家
    QVector<BaseRole*> getSameMapAllRoles(BaseRole *role);

    /// 更新
    void update(void);

private:
    /// 从活动列表中清除指定的怪物
    void deleteMonsterFromActinveList(BaseRole* monster);
    /// 将指定怪物加入到空闲怪物列表
    bool addActivingMonsterToFreeList(BaseRole* monster);

private:
    QList<BaseRole*> mFreeMonsterList;               /**< 空闲怪物列表 */
    QList<BaseRole*> mActivingMonsterList;           /**< 活动怪物列表 */
    QHash<QWebSocket*,BaseRole*> mOnlinePlayList;    /**< 在线玩家列表 */
};

#endif // ROLEMANAGER_H
